import {
  isObject
} from '../shared/utils';

import {
  mutableHandler
} from './mutableHandler';

/**
 * 将对象进行响应式处理
 * @param {*} target 用户定义的对象
 */
function reactive(target) {

  //返回一个响应式对象
  //mutableHandler: 可变的handler 底下有许多底层的Object对象方法
  return createReactiveObject(target, mutableHandler);
}

function createReactiveObject(target, baseHandler) {
  //如果target不是对象就中止，不进行包装
  if (!isObject(target)) {
    return target;
  }

  //实例化一个观察者
  const observer = new Proxy(target, baseHandler);
  //返回一个被代理后的响应式对象
  return observer;
}


/**
 * 实例化一个proxy对象
 * @param target 用户定义的对象
 * @param handler Proxy函数的第二函数，是一个存放底层方法的对象容器
 * @param key 对象里的属性名
 * @param value 对象里属性的属性值
 * @param receiver 代理的原对象/原数组/原函数
 */
// const proxy = new Proxy(target, {
//   get(target, key, receiver) {

//   },
//   set(target, key, value, receiver) {

//   }
// });

export {
  reactive
}